//
// Created by QU on 24-6-14.
//
#include <iostream>
#include <fstream>
#include <sstream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>

using std::cout, std::cin, std::endl, std::unitbuf;

int main(int argc, char const* argv[])
{
    // 你需要使用两种函数, tell和set
    // 后面加上g或者p, g表示get, p表示put, 分别对应读和写两种操作.

    // tell和seek主要用于文件操作，帮助你在文件中定位和获取当前位置。
    // 具体来说，它们与文件流（fstream）类配合使用，常用于定位文件的读写位置。以下是关于它们的详细用法说明：

    // tellg 和 tellp 是用来获取当前文件指针位置的成员函数：

    // tellg 用于输入流（如 ifstream），返回当前读取位置的偏移量。
    // tellp 用于输出流（如 ofstream），返回当前写入位置的偏移量。

    std::ifstream infile("example.txt");
    std::ofstream outfile("output.txt");

    if (infile.is_open() && outfile.is_open())
    {
        // 获取输入文件的当前位置
        std::streampos inputPos = infile.tellg();
        std::cout << "Current read position: " << inputPos << std::endl;

        // 获取输出文件的当前位置
        std::streampos outputPos = outfile.tellp();
        std::cout << "Current write position: " << outputPos << std::endl;
    }

    infile.close();
    outfile.close();
//////////////////////////////////////////////////////////
    ///seekg 和 seekp
    // seekg 和 seekp 用于移动文件指针到指定位置：

    // seekg 用于输入流，移动读取位置
    // seekp 用于输出流，移动写入位置

    // 这两个函数可以接受两种参数形式：
    //  // seekg(offset, direction) 或 seekp(offset, direction)
    //  // seekg(position) 或 seekp(position)
    // 其中，offset 是相对于 direction 的偏移量，position 是绝对位置。direction 可以是以下三个值之一：
    //     std::ios::beg：文件的开头
    //     std::ios::cur：当前文件指针位置
    //     std::ios::end：文件的末尾

    if (infile.is_open() && outfile.is_open()) {
        // 移动读取位置到文件开头之后的10个字节
        infile.seekg(10, std::ios::beg);
        std::streampos inputPos = infile.tellg();
        std::cout << "New read position: " << inputPos << std::endl;

        // 移动写入位置到文件末尾之前的5个字节
        outfile.seekp(-5, std::ios::end);
        std::streampos outputPos = outfile.tellp();
        std::cout << "New write position: " << outputPos << std::endl;
    }

    infile.close();
    outfile.close();

    return 0;
}
